package com.mbengue.corp.artisan.dao;

import java.sql.Timestamp;
import java.util.List;

import org.springframework.dao.DataAccessException;

import com.mbengue.corp.artisan.modele.Client;
import com.mbengue.corp.artisan.modele.Devis;
import com.mbengue.corp.artisan.modele.Facture;
import com.mbengue.corp.artisan.modele.Feuille;

public interface FeuilleDao {
  /**
   * Ajoute la nouvelle feuille à la BD.
   * @param feuille {@link Feuille} à ajouter
   * @throws DataAccessException
   */
  public void ajouterFeuille(Feuille feuille) throws DataAccessException;

  /**
   * Met à jour la feuille dans la BD.
   * @param feuille {@link Feuille} à mettre à jour.
   * @throws DataAccessException
   */
  public void modifierFeuille(Feuille feuille) throws DataAccessException;

  /**
   * Supprime la feuille de la BD.
   * @param feuille {@link Feuille} à supprimer.
   * @throws DataAccessException
   */
  public void supprimerFeuille(Feuille feuille) throws DataAccessException;

  /**
   *  Trouve une feuille via son numero.
   *  @param type {@link String} Facture ou Devis
   * @param numero {@link String} identifiant de la feuille.
   * @return {@link Feuille}
   * @throws DataAccessException
   */
  public Feuille trouverFeuilleParNumero(String type, String numero) throws DataAccessException;

  /**
   * Trouve toutes les feuilles de la BD.
   * @return {@link List}<code><</code>{@link Feuille}<code>></code>
   * @throws DataAccessException
   */
  public List<Feuille> toutesLesFeuilles() throws DataAccessException;

  /**
   * Trouve tous les devis de la BD.
   * @return {@link List}<code><</code>{@link Devis}<code>></code>
   * @throws DataAccessException
   */
  public List<Devis> tousLesDevis() throws DataAccessException;

  /**
   * Trouve toutes les factures de la BD.
   * @return {@link List}<code><</code>{@link Facture}<code>></code>
   * @throws DataAccessException
   */
  public List<Facture> toutesLesFactures() throws DataAccessException;

  /**
   * Trouve toutes les factures dont la date de création est comprise<br/>
   * entre les dates données en entrée.
   * @param debut {@link Timestamp} de début
   * @param fin {@link Timestamp} de fin
   * @return {@link List}<code><</code>{@link Facture}<code>></code>
   * @throws DataAccessException
   */
  public List<Facture> trouverFacturesParDates(Timestamp debut, Timestamp fin) throws DataAccessException;

  /**
   * Trouve tous les devis dont la date de création est comprise<br/>
   * entre les dates données en entrée.
   * @param debut {@link Timestamp} de début.
   * @param fin {@link Timestamp} de fin.
   * @return {@link List}<code><</code>{@link Devis}<code>></code>
   * @throws DataAccessException
   */
  public List<Devis> trouverDevisParDates(Timestamp debut, Timestamp fin) throws DataAccessException;

  /**
   * Trouve toutes les feuille émises pour le client donné en entrée
   * @param client {@link Client} pour lequel les factures sont émises.
   * @return {@link List}<code><</code>{@link Facture}<code>></code>
   * @throws DataAccessException
   */
  public List<Feuille> trouverFeuillesParClient(Client client) throws DataAccessException;

  /**
   * Trouve toutes les factures émises pour le client donné en entrée
   * @param client {@link Client} pour lequel les factures sont émises.
   * @return {@link List}<code><</code>{@link Facture}<code>></code>
   * @throws DataAccessException
   */
  public List<Facture> trouverFacturesParClient(Client client) throws DataAccessException;

  /**
   * Trouve tous les devis émis pour le client donné en entrée
   * @param client {@link Client} pour lequel les devis sont émis.
   * @return {@link List}<code><</code>{@link Devis}<code>></code>
   * @throws DataAccessException
   */
  public List<Devis> trouverDevisParClient(Client client) throws DataAccessException;

  /**
   *  Trouve toutes les feuilles dont le numero ou partie correspond.
   *  @param type {@link String} Facture ou Devis
   * @param numero {@link String} identifiant de la feuille.
   * @return {@link Feuille}
   * @throws DataAccessException
   */
  public List<Feuille> trouverFeuillesParNumero(String type, String numero) throws DataAccessException;

  /**
   * Supprime toutes les feuilles éditées pour ce client.
   * @param client {@link Client}
   * @throws DataAccessException
   */
  public void supprimerFeuilleParClient(Client client) throws DataAccessException;
}
